#pragma once
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>

#define ROOT "/"
#define devnull "/dev/null" // 黑洞文件

void Daemon(bool ischdir,bool isclose)
{
	// 守护进程要屏蔽特定的信号
	signal(SIGCHLD, SIG_IGN); // 忽略子进程结束信号
	signal(SIGPIPE, SIG_IGN); // 忽略Broken Pipe信号
	//成为非组长
	if(fork() > 0)
	{
		exit(0); // 父进程退出
	}
	// 建立新会话
	setsid();
	// 4. 每一个进程都有自己的CWD，是否将当前进程的CWD更改成为 / 根目录
	if(ischdir)
	{
		::chdir(ROOT);
	}
	// 5. 已经变成守护进程啦，不需要和用户的输入输出，错误进行关联了
	if(isclose)
	{
		::close(0); // 关闭标准输入
		::close(1); // 关闭标准输出
		::close(2); // 关闭标准错误
	}
	else
	{
		// 6. 重定向标准输入、输出、错误到 /dev/null
		int fd = ::open(devnull, O_RDWR);
		if(fd > 0)
		{
			::dup2(fd, 0); // 标准输入
			::dup2(fd, 1); // 标准输出
			::dup2(fd, 2); // 标准错误
			close(fd);
		}
		
	}
}